#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../Default/default.h"
#include "../getString/getString.h"
#include "../Parser/parser.h"
#include "../Tag/Tag.h"
#include "../TDC/tdc.h"

#ifndef OK
	#define OK 0
#endif
#ifndef ERROR_N_FOUND
	#define ERROR_N_FOUND 1
#endif

int sin_configuracion = 1;	/* Configuracion de documentacion por defecto (default = true) */
int sin_in_file = 1;				/* Archivo de entrada no encontrado en la lista de parametros (default = true)*/
FILE *file;
char *out_file = NULL;						 /* Nombre archivo de salida */
char *in_file = NULL;							/* Nombre archivo de entrada*/
char *conf_file = NULL;						/* Nombre archivo de configuracion */
char *program_name;				 /* Nombre de ejecucion del programa (para errores e informacion) */
int exeStatus = 0;
char respuesta;

int file_err(const char *filename){
	fprintf(stderr,"No se encontro el archivo %s\n",filename);
	exit (8);
	}
/*
* verifica la existencia del archivo indicado
*/
int file_exists(const char * filename){
	if (file = fopen(filename, "r")){ /*Prueba de apertura para lectura*/
		fclose(file);
		return OK;
	}
	return ERROR_N_FOUND;
}

/*
 * si se ingresa parametros incorectos se imprime la informacion de uso	 *
 */
void uso(void){
	fprintf(stderr,"Documentador automatico de codigo fuente\n");
	fprintf(stderr,"El uso es %s [options] [file-list]\n",
															program_name);
	fprintf(stderr,"Options\n");
	fprintf(stderr,"  -i <nombre-arch>          Archivo de entrada\n");
	fprintf(stderr,"  -o <nombre-arch>          Archivo de salida\n");
	fprintf(stderr,"  -c <nombre-arch>          Archivo de configuracion (opcional)\n");
	exit (8);
}
int main(int argc, char *argv[]){
	/* Nobre de ejecucion para salidas de error e informacion */
	program_name = argv[0];
	/*Detecta la validez de cada opcion.
	 *	 si no hay argumentos o son invalidos se detiene.
	 */
	while ((argc > 1) && (argv[1][0] == '-')) {
		 /* argv[1][1] es el caracter de la opcion actual.
		 */
		switch (argv[1][1]) {
			/* -o<name>	output file
			 *		[0] guion
			 *		[1] "<opcion>"
			 *		[2] espacio
			 *		[3] nombre
			 */

			case 'o':
					out_file = strdup(&argv[1][3]);
					if (!file_exists(out_file) == ERROR_N_FOUND){
						printf("Se ingreso un nombre de archivo existente\nse perdera ");
						printf("toda la informacion del archivo %s, desea continuar? (y/n) ",out_file);
						while (!(respuesta == 'n' || respuesta == 'y')){
							scanf("%c",&respuesta);
						}
						if (respuesta == 'y') {
							if(out_file) free(out_file);
							out_file=NULL;
			}
					}
					break;
			case 'i':
					in_file = strdup(&argv[1][3]);
					if (file_exists(in_file) == ERROR_N_FOUND){
						fprintf(stderr,"No se puede abrir el archivo %s\n",in_file);
						free(in_file);
						uso();
					}
					sin_in_file = 0;
					break;
			case 'c':
					conf_file = strdup(&argv[1][3]);
					if (file_exists(conf_file) == ERROR_N_FOUND){
						fprintf(stderr,"No se encontro %s para la opcion -c\n",conf_file);
					}else{sin_configuracion = 0;}
					break;
			default:
					fprintf(stderr,"Parametro incorrecto %s\n", argv[1]);
					uso();
		}
		/*
		 * aumento la lista de argumentos
		 * bajo la cantidad de argumentos
		 */
		argv = argv + 2;
		argc = argc - 2;
	}
	if (sin_in_file)
		uso();
	if (sin_configuracion){
		printf("Utilizando configuracion por default.\n");
	}
	if (!out_file){
		out_file=malloc(strlen(in_file)+5);
		sprintf(out_file,"%s.out",in_file);
		printf("El arcivo de salida sera %s\n",out_file);
	}

  printf("Main de prueba de los TDAs!\n\n\n");
  TDC tdc;
  exeStatus = TDC_Crear(&tdc, "archConf.txt");
  tdc.archprograma = fopen("salida","wt");
  TDC_Documentar(&tdc,in_file);
	free(out_file);
	free(in_file);
  return exeStatus;
}
